STORES Tech Conf 2024
https://gyazo.com/456e9dcac5585a1a2488d6a622ab7dd4
https://storesinc.tech/conf/2024
AIの時代で我々はどのようにコードを書くのか
藤村大介
CTO
昨今何が起こっているか
AIがコードを書けるようになっている
GitHub Copilot
Cursor
AIが合理的と感じられる判断を行えるようになっている
我々の仕事は無くなるのではないか?という不安
しかし、人間にしかできないこともあるのではないか?
残された仕事について語る
概要
合理主義
1637年ヨーロッパ
キリスト教が中心の世界
科学が標的にされていた時代
デカルト「我思う、ゆえに我あり」
人間はどうなっているのかを探す行為=理性の誕生
キリスト教にはない考えを持たせる
科学革命
理性の力の証明をshていた時代
理性
人間の論理的思考や推論の脳直
知識の源泉
合理主義とはキリスト教じゃなく科学を中心にした一つの体系で解明できる考え方
理性はその源泉となる
社会はどうするべきか?
啓蒙思想
理性によって人や社会のあるべき姿は解明できると拡張したもの
それにより人類は進歩できる
フランス革命はこの影響をつよく受けている
三権分立などもそう
理性、合理主義、啓蒙思想に共通する事項
何事も答えがあってそれには一つの体系がある
AIは合理的な動く理性
LLMとは
大規模テイストデータから学習したAIモデル
自然言語を理解する
動作メカニズム
言語パターンを学習して文脈に基づいて最適な応答を確立的に予測
合理主義を取得する
理性の模倣もできる
論理的思考や推論ができる
つまり全部やらせればいいのではないか?
現在能力の限界はあるが、能力の向上が止まる確証はない
止まらない確証もないが
唯一の解があるなら任せられるのではないか
合理主義の限界「悲劇と限定性」
そもそも「何事も答えがあってそれには一つの体系がある」この前提は正しい?
ギリシアの演劇の話
この話をするのは社会的な営みとされている
アイスキュロス「アガメムノン」の話
戦争に負けるか、娘を生贄に捧げるかの話
道徳的ジレンマはあるが選択をしなければならない
ここに解はない
合理主義の一つの体系がすべてを説明する、仮定のほころびがある
どちらかを選べないから
キャリアの問題はここに近い
国内スタートアップ、外資テックジャイアントの選択
多元主義
複数の両立しない価値がある
悲劇はここの典型例
合理主義への強烈な反論
両立しないけど対話ができる・共感できる・妥協できるという立場
機能開発かリファクタリング
短期長期の比較
限定合理性という考え方が便利
完全な合理性は現実的に無理という前提
経済学は人間の行動をモデル化したもの
行動するのが前提のもの
これはLLMでも同じ
だいたい動く合理主義で我慢する路線
見解が一致する価値もあるのではないか?
両立しなくても提案できるのかもしれない
人間も限定的な合理性で満足してるじゃん
失業の可能性
残された仕事は?
我々の仕事とはなにか
創造的破壊をすること
ヨーゼフ・シュンペーター「資本主義、社会主義、民主主義1」
新製品、新技術を毎日やっている
新しく何かをつくること
多元主義
しかし人は選択、行動、結果を引き受けて未来に進むことができる
限定合理性
しかし人は選択、行動、結果を引き受けて未来に進むことができる
https://gyazo.com/f39658d5b9c3f2af2b61dfa7dc059872
繋がっていくサービスを支える開発環境作り
Shia
技術基盤グループ
https://gyazo.com/31e955709c88e03e9c437abb7f4d1e5f
イベントリポジトリ
Pub/Subモデル
開発環境の特徴
1つのチームが複数のサービスを触る機会が多い
インフラ環境・開発発言がバラバラ
サービス買収による影響
開発サーバはDocker Composeで動かす
課題
複数を動かすのは大変(バリエーションが多い)
make
localhostが使えない
ドメインに紐づける
社内向けループバックドメイン
単一エンドポイントを用意する
サブドイメインやパスをみてルーティングする
TLS証明書が必要
STORES-composeで動かす
必要なものだけ立ち上げるようにする
どのサービスにリクエストしてるかがわからない
失敗した場合はフォールバックするハンドラを実装
どこのサービスを実行するかが表示される
サービス登録が大変
構成要素が多い
設定を書き間違えるとデバックが大変
抽象化設定を用意して起動時に必要な情報を書き込む
サービスAにサービスBが必要な話
リモート環境から取得するものがあればそのまま使う
API Gatewayどうしよう
リモートにまとめる
ローカルで動かす場合認証認可はどうする?
ダミーauthorizerを用意する
Event Repositoryどうしよう
Webhook URLを登録する話
イベントブローカーを用意する
リポジトリを購読している
そこを購読できる立ち位置
ローカルに流す
サービス間ルーティング
https://gyazo.com/2ba74158d5f47d0437b919d4eb3da487
https://gyazo.com/3b352239857bb70530a514412d23317ehttps://gyazo.com/d64062934dc37d94094d0548f8793e42
課題はまだまだある
マシンパワー足りる?
開発はホストの方が良いのではないか?
dev containerの活用
リブートのたびにコンテナを毎回再起動したくない
サービスを一気に起動したいユースケースもある
Jetpack Composeで作る楽しい金額入力画面!
chuka
モバイル開発本部 決済グループ
STORES決済
金額入力画面のここが楽しい
円形エフェクトが楽しい!
波紋の広がり方が楽しい!
ドラッグに追従して楽しい!
数字が飛んでいって楽しい!
問題点
入社当時はJava
現在はKotklin
Android Viewがわからなかった
Jetpack Composeへの移行を進めている
最終更新実質5年前
複雑で難解!
Jetpack Composeの実装
キーを1つ作る
押下時のアニメーションを作る
押下の状態をつくる
円形エフェクト
ジェスチャーの判定
detectTapGestures
キーパッドらしく配置する
LazyVerticalGrid
ドラック時の実装をする
1. ドラッグジェスチャーの検出
2. ポインタ位置の検出
3. 1と2を組み合わせる
https://gyazo.com/9f57b8835e8843c660e4247daf82aebd
STORES の OAuth 大改造!認可対象変更までの険しい道のり
Taiki Yokokawa
開発B本部 プロダクト基盤グループ
https://gyazo.com/b10ea98e4d6e33d3f7c0692e0f6592ca
https://gyazo.com/22b0b19d30dc2b4fb5446285192aadc5https://gyazo.com/f7794262cc144b6579ca501c588d0a17
直面した課題
再認可の挙動をどうするか
3rd Partyの実装次第だけど再認可したときに連携が止まる可能性がある
トークンを上書きする場合後から認可した事業者しか連携ができない
ユーザー目線だとつらい
同時に複数の認可は不可にする
連携する事業者の変更は明示的に連携を切って再認可
発行済みのアクセストークンも認可済対象を変更したい
店舗に対してアクセス権限がある
事業者に対して権限がもつようにしたい
ID基盤に流して店舗からIDに変更・更新するとよさそう
設計開始で3ヶ月後にリリース
デプロイ完了
発行済みのトークン認可対象の更新するだけ
リリースが失敗した
CPU使用率が急上昇した
DB負荷がスパイクした
処理内に重いクエリがあってテスト環境では気づけなかった問題
やり方を変更する
必要なデータをCSVで受け取ってID基盤でバッチ処理を実行する
2週間後に再リリースして成功、トークン自体も更新できた
OAuthのこれからについて
Salesforceなどとデータ連携していきたい
CRMツール
MAツール
開発パートナー用の管理画面を作りたい
プロダクトのバンドル化を見据えたプライシングにおけるデータマートの新しい活用方法
末重拓己
テクノロジー部門・データ本部
コンパウンド(コンパウンドスタートアップ)
創業初期からデータ機能面で連携した複数プロダクトを扱う会社
自社製品を広めやすい戦略
バンドル化によってデータ・機能面で付加価値を付与する
併用利用を超えた価値を提供したい
どういう価値があるのか
データ連携
会員情報
機能連携
ログインを1回で済ませたい
プライシング
コスト
自社においてもネガティブなものがないかも検討する必要あり
業種の組み合わせによって刺さるデータも違う
シミュレーションの数だけ全パターンを網羅した複雑なシートを用意しないといけない
基礎データを渡される
どこで処理してもってきたかが不明瞭
事業者ID別にシミュレーションをクエリで行いコード管理の仕組みを援用し管理するようにする
データマート上で構築する
クエリ管理が可能
管理・変更が俗人化しない
可視化が容易になる
BAツールと連携していることがあるのでビジネス・経営サイドで簡単に見えるようにする
https://gyazo.com/1c4c7d517cedb7bec1000a661a00210d
データマートの構築
ID単位でのGMV・売上総利益・粗利の連結
総額の未来データをとってくる
各IDに分配する
一定の基準とは?
GMVや売上、前年度別などで比較
変数をクエリで掛け合わせる
対象フラグ
従量課金割引
ソフトウェア費
シミュレーション期間
などなど
必要な指標を計算する
CROSS JOINでシミュレーション変数を用意
可視化
https://gyazo.com/9b096df02e5b9631fb7f504ef84e9267https://gyazo.com/157de1c9c10bf3cbcd4851cfee834fc2
https://gyazo.com/4db2beeedce2d0b95d55553b3004d61b
複数のScrollViewが連動! STORESレジ でスプレッドシート風UIを実装しました
satoryo
モバイル開発本部 レジ・予約グループ
STORES レジ|無料ではじめられるクラウド・POSレジアプリ
ネイティブアプリ
Swift
UIフレームワーク
SwiftUI(一部除く)
カレンダー実装ライブラリ
bannzai
UIKitで実装
CalendarLib
Objective-Cで実装
SwiftUIでのライブラリがなかったので自作する機運
構成要素
スタッフ
タイムライン
予約情報
1日の予約情報を表示、縦横にスクロールする
スプレッドシートに似ている
実装要件・仕様
https://gyazo.com/ed7cb0c149d9dfbde74d4931d3e91441
必要なパーツを検討する
ScrollView
GridView
これらではうまくいかなかった
スクロールする場合、縦横の要素をそれぞれ同時にスクロールさせたい
片方が動いたら片方連動したい
ScrollViewを同時に動かすものがある
https://github.com/stonko1994/SimultaneouslyScrollView
https://gyazo.com/b844159cf916f15b4448fe84784ee8a2
課題点
パフォーマンス面
予約数が増えるとその分重たくなる
UI操作
DnDしたい
本当は秘密にしておきたい、STORES決済 QA 本番環境での検証の話
BPR本部 QAグループ
zukky
ricky
makky
なぜ本番環境が必要なのか
テスト環境
高額決済などの確認ができる
本番環境
本物のお金を使って確認ができる
ユーザーと同じ環境で確認したい
QAプロセス
テスト計画
テスト分析
テスト設計
分析設計レビュー
テスト実装
テストケースレビュー
検証
終了作業
成果物からプロセスを改善していく
どのような検証か
決済機能の正常動作
クレジットカード
電子マネー
WeChat Pay
いつ行うか
推奨端末・OSの追加を行う
プロジェクトの最終的な動作環境
外部連携との連携との検証
レシートをメールで送信できるか
プリンターからのレシート印刷
Money Foward、Freeeとの連携
テストでは発生させられない
WeChat Payの残高不足エラー
テスト環境では残高不足の概念がない
好きな金額で好きなだけ決済ができる
機能追加・改修の内容に合わせた研修
選定・精査の基準
決済・返金できるか
本番で担保する必要があるか精査
本番環境でできないものがある場合はテスト環境で徹底して検証する
クレジットカードのブランド網羅
契約が難しい
クレジットカードは売っているものではない
テスト計画の時点で本番環境のケース内容を考慮する
事前にPdMに相談しておく
代替案を用意する猶予が生まれる
リスクが出る場合
品質リスクを洗い出す
共有する
PdMと開発とで合意を取る
できない時のリスクをしっかり考える
気をつけないといけないこと
指定されたアカウント以外での決済は禁止
会計処理の都合
環境ごとに使用する機材を使い分ける
返金できるものは当日中に返金処理を行う
想定されるやらかし(ヒューマンエラー)
本番環境で検証用クレジットカードを使ってしまう
検証カードのデータが本番環境に残存してしまう
指定アカウント以外の決済
10年物のRailsアプリにキャッチアップ!〜コードを読まずに理解したかった〜
ima1zumi
開発A本部 サービスGTMグループ
STORES予約
Ruby on Rails
11年目
コア開発者13人
難しさ
多機能さ
月謝・回数券ごとに有効期限や予約可能回数
移行過程の複雑さ
店舗アカウントが3世代前
ロジックの難しさ
予約可否の計算
47万行
1087Model
705Contoroller
コードを読まずに理解するにはどうしたか?
SRORES予約ブートキャンプ
アプリ操作に慣れるためのクイズ集
初級・中級・上級・超上級
触りながら慣れる
欲しいデータを作るやり方を学ぶ
ニッチな機能をカバーする
ER図
主要13モデルに絞る
最も重要なモデルとの関係がわかる
https://github.com/koedame/rails-mermaid_erd
ドキュメントを呼ぶ
esa
一番ドキュメントが集約してる
Cosense
予約開発チームがもっとも使う
知らないことがあったらここを調べる
なかったら追加していく
GitHub
ADR
教えてもらう
知ってる人に聞くのが手っ取り早い
1on1で教えてもらった場合はドキュメントを残す
LTしてもらう
知りたい概念を知ってそう人にLTしてもらう
どうやってコードを読むのか
解きたいことを明らかにする
何を解決したくてコードを読むのか
コードの中で迷子になりやすいので
関連情報がないかを探す
git blame
実装時PR
ドキュメントや設計
ざっと流れを追う
クラスやメソッド名に着目
実際に知らない機能を調べる方法
問い合わせ:STORES予約と連携するGoogleカレンダーに予約が連携されない
こたえ:権限が読み取りのみになっていた
Cosenseで調べる
問題を切り分ける
どこまで成功しているのかを探す
リクエスト・レスポンスログを出しているところを探す
どこから探すのかわからない
calendar_idで検索した
連携成功したやつしか残ってない
該当の予約の時の連携情報がどうなってるかを探す
「お急ぎ便対応予定が連携されない」というページがあった
いくつかできないパターンのページが存在していた
OSSのコードリーディングでも同じことがいえる
読んで触ると理解が進む
コードベースのくせに慣れる
コンポーネントライブラリとして作る、ポータブルなデータ分析
原田陽紗子
開発B本部 新領域開発グループ
https://tttttahiti.stores.jp/
STORESはM&Aを繰り返して巨大になってきた
「今月の売り上げをまとめてみる」機能
データ分析β(moana)
売上やアクセスなどのデータを一元集計、GUIで操作
データ分析の中央集権などに扱いたい
コンポーネントベースのUI開発に混ぜて使えるようにしたい(ミニデータ分析β)
絶賛試行錯誤中
クロスフレームワークが大変
Nuxt、Vue.js、Next.js
どう対応するか
React./ Vue
フレームワーク依存
工数2倍
iframe
フレームワーク依存しない
枯れている技術
クロスドメイン間の問題
idpとクロスサイト状態なのでiframe内アプリでログインセッションが張れない問題がある
Web Components
1個で済む
Web標準技術
調査して不安要素はあるがとりあえずWeb Componentsでやってみよう
SSRできない
App Routerなので大変
Reactコンポーネントライブラリをつくる
NuxtのSSRは解消していない
使ってないので保留
バンドル結果がでかくなってる
react-domが原因?
Preactはどうだろう
サイズは減った
ブラウザで動かない
エイリアスの問題がありそう?
バンドルしないで依存関係にもたすのが良さそう
New Ruby Engineering
Rubyコミッター
Koichi Sasada
Yusuke Endoh
藤村大介CTO
そもそもなんでSTORESへ?
ほぼRubyで動いている
https://isrubydead.com/
よくある話
RUbyKaigiで行くと活発的なコミュニティなのがわかる
商売をさせてもらっている・大きい責任をもっている
Rubyをどうみるか(強みと弱さを作ってる立場)
Ruby on Railsが描きやすい
Rubyは50兆円稼いでいる
80点は取れている言語
嫌なところもよくみえる(20点分)
性能をよくしたい
Python、Rust、Goとの比較
人々の不満が将来の評価にどう関わるかはわからん
開発支援が弱い不満はある
2030年までにやること
型っぽい開発体験
TypeProf
TypeScriptはよく比較される
どれくらいしっかり型システム・型チェックをやってるのか研究
@mametter: TypeScriptの型チェックはパスするんだけど、実行するとエラーになるコードを見つけた。怒ってくれるオプションとかあるのかな
const f = () => x;
f(); //=> Cannot access 'x' before initialization
const x = 1;
https://t.co/axWeEStF0c
雑な感じがする
Hoisting
型のように振る舞うようにしたい(まじめにやらない)
ユースケースごとに対応してる
問題があったらそこを叩く形で対応している
RubyMineでうまく行くならいいのかな
5年後にはこれを使う人が増える?
LSPが動くIDE(VSCode)は?
型注釈を書かなくても済むようにしたい
あ、軽い並行言語
軽い言語を目指したい
Syncronouce
Ractor
並行処理を気楽に描きたい
Elixir
Go
Cで実装するようなつらさ
重い処理をプロセス外に出す
Ruby自体を変えてしまうもの
新しい言語をつくるようなもの
現状のRuby on Railsだと動かない
ActiveRecordが動かない
クエリや定数のキャッシュ
エコシステムが回り出したら考えるかも
インスタンス変数を書き込めたらめちゃくちゃになる
クラス変数も
すごく速いRuby
JITコンパイラ
YJIT https://github.com/Shopify/yjit
Rust
より速い
よりwarmup timeが短い
よりメンテしやすい
プログラミング言語の未来とRuby
AIでどうするかはホットな話題
やりたくないコードを書いてくれる
プログラミング言語は人間に読みやすい中間言語になるのではないか?
人間はハンコを押すだけになる?
短ければ短いほどいいのではないか
核融合ができる世界
資源を気にしなくていいこともあるのではないか
5年後はあまり変わってないのではないか
#STORES株式会社 #2024